import java.util.List;

import jp.dodododo.dao.sql.orderby.OrderByArg;
import jp.dodododo.dao.sql.orderby.SortType;

import org.apache.commons.lang.StringUtils;

/**
 * sqlファイルから呼び出す場合にパッケージを記述すると可読性が下がるため、 このクラスは意図的に「デフォルトパッケージ」に置く。
 * 
 * @author Satoshi Kimura
 */
public abstract class SqlUtil {

	/**
	 * Listが null または空の場合にtrueを返す
	 * 
	 * @param list
	 *            比較するList
	 * @return null または空の場合にtrue
	 */
	public static boolean isEmptyList(List<?> list) {
		if (list == null || list.isEmpty()) {
			return true;
		}
		return false;
	}

	/**
	 * Listが null または空の場合にfalseを返す
	 * 
	 * @param list
	 *            比較するList
	 * @return null または空の場合にfalse
	 */
	public static boolean isNotEmptyList(List<?> list) {
		return isEmptyList(list) == false;
	}

	/**
	 * 文字列が null または空文字列の場合にtrueを返す
	 * 
	 * @param string
	 *            比較する文字列
	 * @return null または空文字列の場合にtrue
	 */
	public static boolean isEmpty(String string) {
		return StringUtils.isEmpty(string);
	}

	/**
	 * 文字列が null または空文字列の場合にfalseを返す
	 * 
	 * @param string
	 *            比較する文字列
	 * @return null または空文字列の場合にfalse
	 */
	public static boolean isNotEmpty(String string) {
		return isEmpty(string) == false;
	}

	/**
	 * 文字列が等しいかどうかを比較します。
	 * 
	 * @param expected
	 *            予想
	 * @param actual
	 *            実際の値
	 * @return 等しい場合trueを返す
	 */
	public static boolean equals(String expected, String actual) {
		if (expected != null) {
			return expected.equals(actual);
		} else if (actual != null) {
			return actual.equals(expected);
		} else {
			return true;
		}
	}

	/**
	 * 文字列が等しくないかどうかを比較します。
	 * 
	 * @param expected
	 *            予想
	 * @param actual
	 *            実際の値
	 * @return 等しい場合falseを返す
	 */
	public static boolean notEquals(String expected, String actual) {
		return !equals(expected, actual);
	}

	/**
	 * 数値が等しいかどうかを比較します。
	 * 
	 * @param expected
	 *            予想
	 * @param actual
	 *            実際の値
	 * @return 等しい場合trueを返す
	 */
	public static boolean equals(Number expected, Number actual) {
		if (expected != null) {
			return expected.equals(actual);
		} else if (actual != null) {
			return actual.equals(expected);
		} else {
			return true;
		}
	}

	/**
	 * 数値が等しくないかどうかを比較します。
	 * 
	 * @param expected
	 *            予想
	 * @param actual
	 *            実際の値
	 * @return 等しい場合falseを返す
	 */
	public static boolean notEquals(Number expected, Number actual) {
		return !equals(expected, actual);
	}

	/**
	 * 引数で受け取った値をSQLに変換します。
	 * 
	 * @param argsList
	 *            ORDER BYのリスト
	 * @return ORDER BY句
	 */
	public static String orderBy(List<OrderByArg> argsList) {
		OrderByArg[] args;
		if (argsList == null) {
			args = null;
		} else {
			args = argsList.toArray(new OrderByArg[argsList.size()]);
		}
		return orderBy(args);
	}

	/**
	 * 引数で受け取った値をSQLに変換します。
	 * 
	 * @param args
	 *            ORDER BYの配列
	 * @return ORDER BY句
	 */
	public static String orderBy(OrderByArg... args) {
		if (args == null || args.length == 0) {
			return "";
		}
		StringBuilder sql = new StringBuilder();
		for (OrderByArg arg : args) {
			sql.append(arg.getColumnName());
			SortType sortType = arg.getSortType();
			if (sortType != null) {
				sql.append(" ");
				sql.append(sortType.toString());
			}
			sql.append(", ");
		}
		sql.setLength(sql.length() - ", ".length());
		return sql.toString();
	}
}
